package cc.spider.web.parser;

import cc.spider.web.exception.ParserException;
import org.jsoup.nodes.Attribute;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.*;

public class JsoupElement implements IElement<JsoupElement, JsoupElements> {
    private Element root;

    public JsoupElement(Element root) {
        this.root = root;
    }

    @Override
    public JsoupElement query(String selector) {
        return new JsoupElement(root.select(selector).get(0));
    }

    @Override
    public JsoupElements queryAll(String selector) {
        return new JsoupElements(root.select(selector));
    }

    @Override
    public JsoupElements children() {
        return new JsoupElements(root.children());
    }

    @Override
    public JsoupElements children(String selector) {
        Elements elements = new Elements();
        Elements els = this.root.select(selector);
        for (Element element : els) {
            Elements children = element.children();
            elements.addAll(children);
        }
        return new JsoupElements(elements);
    }

    @Override
    public Map<String, String> attrs() {
        Map<String, String> attrs = new HashMap<>();
        List<Attribute> attributes = this.root.attributes().asList();
        for (Attribute attr : attributes) {
            attrs.put(attr.getKey(), attr.getValue());
        }
        return attrs;
    }

    @Override
    public String attr(String attrName) {
        return this.root.attr(attrName);
    }

    @Override
    public String content() {
        return this.root.html();
    }

    @Override
    public String source() {
        return this.root.outerHtml();
    }

    @Override
    public String toString() {
        return this.source();
    }

    @Override
    public String text() {
        return this.root.text();
    }

    @Override
    public String absUrl(String type) {
        if (null == type) {
            return this.absUrl();
        }else{
            return this.root.absUrl(type);
        }
    }

    @Override
    public String absUrl() {
        String[] urlKeys = new String[]{"href", "src"};
        for (String key : urlKeys) {
            if (this.root.hasAttr(key)) {
                return this.root.absUrl(key);
            }
        }
        return "";
    }

    @Override
    public String val() {
        return this.root.val();
    }
}
